"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 21、内置库：文件处理.py
"""

"""
输入 ： 数据从  磁盘、网络   ->    内存
输出 ： 数据从  内存     ->    磁盘、网络
数据驱动 和 读取配置文件
"""
import os

dirname = os.path.dirname(__file__)
datapath = os.path.join(dirname, '文件读写', "data.txt")

# 文件操作步骤：  1、打开文件  2、操作文件：读/写内容  3、关闭文件（读写完成，要及时关闭）
"""

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
源码：
    file：文件路径
    mode: 模式，默认为只读模式
    encoding：编码格式，有中文时（解决乱码）

"""

# r: 只读模式指针指向文件头，文件不存在会报错
# 找出文件，定义操作方式
f = open(datapath, 'r', encoding='utf-8')
# 读取文件内容 : 一次读取文件所有内容   结果为str
'''
结果为：
hello world!
hello python!
hello 贾鹏博
'''
print(f.read())

"""
读操作：
    read()  一次读取文件所有内容，返回一个 str
    read(size)  每次最多读取指定长度的内容，返回一个str，在 python2 中 size 指定的是字节长度，在 python3 中 size 指定的是字符长度
    readlines()  一次读取文件所有内容，按行返回一个 list
    readline()  每次只读取一行内容

"""

f.seek(0)
# 读取几个字符
print(f.read(5))  # hello

# 每次只读取一行内容
# 设置游标位置
f.seek(0)
a = f.readline()
# 结果为：hello world!
print(a)
# 结果为str
print(type(a))

# 多行读取
# 设置游标位置
f.seek(0)
# 返回结果是一个列表list   结果为：['hello world!\n', 'hello python!\n', 'hello 贾鹏博\n']
print(f.readlines())

"""
忘记关闭文件的危害：
    打开文件达到一定数量，将会导致打开失败
    占用内存空间，非常浪费资源
    会导致系统自动回收资源，而丢失数据
"""


# 关闭文件
f.close()

'''
结果为：
hello world!
hello python!
hello 贾鹏博
'''
# 常用with打开文件。读写操作完成后，会自动关闭文件
with open(datapath, 'r', encoding='utf-8') as f:
    print(f.read())

# 查看关闭状态  True
print(f.close())

# r：以只读模式打开文件，并将文件指针指向文件头；如果文件不存在会报错
# w: 以只写模式指针打开文件，并将文件指针指向文件头，文件存在则清空并写入，文件不存在则会创建
# a: 以只追加写模式打开文件，指针指向文件末尾，文件不存在则会自动创建
# r+ : 在r基础上增加了可写功能
# w+: 在w基础上增加了可读功能  没有文件，先创建。先清空，再写入
# a+: 在a基础上增加了可读功能  追加内容
# b : 读取二进制文件（音乐，视频等），需要与上面几种模式搭配使用 ，如ab, wb , ab+


"""
写操作实战：
    mode="w+"，读写权限，会新建文件，清空内容再写入
    mode="r+"，读写权限，替换原来的内容
    mode="a+"，读写权限，追加内容

"""

with open(datapath, 'a+', encoding='utf-8') as f:
    f.write('\nhello 测开')

'''
结果为：
hello world!
hello python!
hello 贾鹏博
hello 测开
'''
with open(datapath, 'r', encoding='utf-8') as f:
    print(f.read())

# b: 以二进制形式打开文件

"""
总结：
    使用 with 方法，会自动完成关闭操作
    通过 python 封装的 API,可以实现 读，写，追加操作
    文件打开要使用 utf-8 的编码格式（以免中文出现乱码）
"""
